package com.ccjt.efcfs.cal;

import com.ccjt.efcfs.dto.LoanInfo;
import com.ccjt.efcfs.dto.RepayPlanCal;
import com.ccjt.efcfs.util.DecimalUtils;

import java.math.BigDecimal;

import static com.ccjt.efcfs.constant.CalculateConstant.Decimal.BD_ZERO;

/**
 * 等额本金
 * 概念： 把贷本金总额按期数等分，每月应还同等数额的本金和剩余贷款在该月所产生的利息
 * 公式：
 *  分期应还本金 ＝ 贷款本金 ÷ 还款分期数
 *  分期应还利息 ＝ 剩余本金 × 分期利率(日利率*分期日)
 *  分期应还本金利息 ＝ 分期应还本金 + 分期应还利息
 *  应付总利息 = 分期应还本金 × (1 + 还款分期数) × 还款分期数 ÷ 2 × 分期利率
 *  * * * * * = (贷款本金 ÷ 还款分期数) × (1 + 还款分期数) × 还款分期数 ÷ 2 × 分期利率
 *  * * * * * = 贷款本金 × (1 + 还款分期数) × 还款分期数 ÷ 2 × 分期利率
 */
public class AverageCapitalReduceInterestCalculate extends CalculateBase {

    public AverageCapitalReduceInterestCalculate(LoanInfo loan) {
        super(loan);
    }

    @Override
    protected void calRepayPrincipal(RepayPlanCal plan) {
        // 7. 应付本金
        // 计算-本期归还本金，根据贷款类型计算
        BigDecimal perRepayPrincipal = loan.getAvgPrincipal();
        // 7.1 本期计划周期应付本金
        plan.setMonthPerRepayPrincipal(perRepayPrincipal);
        // 7.2 本期计划周期金融日应付本金
        plan.setFinancePerRepayPrincipal(perRepayPrincipal);
        // 7.3 本期周期自然日应付本金
        plan.setNaturePerRepayPrincipal(perRepayPrincipal);
        // 7.4 本期实际自然日应付本金
        if (loan.getEarlyRepayTotal() == null) {
            plan.setActualPerRepayPrincipal(perRepayPrincipal);
        } else {
            plan.setActualPerRepayPrincipal(DecimalUtils.sub(loan.getEarlyRepayTotal(), plan.getActualPerRepayInterest()));
        }
    }

//    @Override
//    protected void calRepayTotal(RepayPlanCal plan) {
//    }

}
